package com.cqq.common.core.util;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.PropertyFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * <h3>Json数据处理工具类</h3>
 * 
 * @author xijq
 * @version 1.0.0
 * 
 */
public class JsonUtil {
	
	private static final Logger log = LoggerFactory.getLogger(JsonUtil.class);
	
	private JsonUtil(){}
	
	/**
	 * <h3>将对象转化成Json字符串</h3>
	 * 
	 * @param obj 对象类
	 * 
	 * @return String Json格式字符串
	 * 
	 */
	public static String toJson(Object obj){
		if(obj==null){
			return null;
		}
		return JSON.toJSONString(obj,new MyPropertyFilter());
	}
	
	/**
	 * <h3>将对象转化成Json字符串</h3>
	 * 
	 * @param obj 对象类
	 * 
	 * @return String Json格式字符串
	 * 
	 */
	public static String toJsonWithClassName(Object obj){
		if(obj==null){
			return null;
		}
		return JSON.toJSONString(obj,new MyPropertyFilter(),SerializerFeature.WriteClassName);
	}
	
	/**
	 * <h3>将Json字符串转化成对象</h3>
	 * 
	 * @param <T> json转换后的对象实例类
	 * @param json Json字符串
	 * 
	 * @return 对象类
	 * 
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getObject(String json){
		if(json==null){
			return null;
		}
		return (T) JSON.parse(json);
	}
	
	/**
	 * <h3>将Json字符串转化成对象</h3>
	 * 
	 * @param <T> json转换后的对象实例类
	 * @param json Json字符串
	 * @param clazz 对象的Class类型
	 * 
	 * @return 对象类
	 * 
	 */
	public static <T> T getObject(String json, Class<T> clazz){
		if(json==null || clazz==null){
			return null;
		}
		return JSON.parseObject(json,clazz);
	}
	
	/**
	 * <h3>将Json字符串转化成对象</h3>
	 * 
	 * @param <T> json转换后的对象实例类
	 * @param json Json字符串
	 * @param clazz 对象的Class类型
	 * 
	 * @return 对象类
	 * 
	 */
	public static <T> T getObject(String json, TypeReference<T> type){
		if(json==null || type==null){
			return null;
		}
		return JSON.parseObject(json,type);
	}
	
	/**
	 * <h3>将Json字符串转化成对象</h3>
	 * 
	 * @param <T> json转换后的对象实例类
	 * @param json Json字符串
	 * @param className 对象的Class类型名称
	 * 
	 * @return 对象类
	 * 
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getObject(String json, String className){
		if(json==null || className==null){
			return null;
		}
		try {
			return (T) getObject(json, Class.forName(className));
		} catch (ClassNotFoundException e) {
			log.error(e.getMessage(),e);
			return null;
		}
	}
	
	/**
	 * <h3>将Json字符串转化成List对象</h3>
	 * 
	 * @param <T> json转换后的对象实例类
	 * @param json Json字符串
	 * @param clazz 对象的Class类型
	 * 
	 * @return List对象
	 * 
	 */
	public static <T> List<T> getList(String json, Class<T> clazz){
		if(json==null || clazz==null){
			return null;
		}
		return JSON.parseArray(json, clazz);
	}
	
	/**
	 * <h3>将Json字符串转化成List对象</h3>
	 * 
	 * @param <T> json转换后的对象实例类
	 * @param json Json字符串
	 * @param className 对象的Class类型名称
	 * 
	 * @return List对象
	 * 
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> getList(String json, String className){
		if(json==null || className==null){
			return null;
		}
		try {
			return (List<T>) getList(json, Class.forName(className));
		} catch (ClassNotFoundException e) {
			log.error(e.getMessage(),e);
			return null;
		}
	}
	
	static class MyPropertyFilter implements PropertyFilter{

		public boolean apply(Object object, String name, Object value) {
			return value!=null;
		}
		
	}
	
	/*
	static class MyValueFilter implements ValueFilter{

		@Override
		public Object process(Object object, String name, Object value) {
			log.info("@@@@@@@@@@@@@@ name:"+name);
			log.info("@@@@@@@@@@@@@@ value:"+value);
			log.info("@@@@@@@@@@@@@@ object:"+object);
			return value;
		}
		
	}

	public static <K,V> Map<K,V> getMap(String json,Class<K> clazzK,Class<V> clazzV){
		if(json==null || clazzK==null || clazzV==null){
			return null;
		}
		Map<K,V> map=new HashMap<K,V>();

		return null;
	}*/
}
